package com.hz.framework.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.hz.framework.util.CommonUtils;
import com.hz.framework.util.SqlParameter;
/**
 * *****************************************************************************
 *
 *               Copyright(c) 2011 by 哈尔滨华泽数码科技有限公司.
 *                       All rights reserved.
 *
 *******************************************************************************
 *     File Name        :com.hz.framework.dao.DBDAO.java
 *     Description(说明)	:针对DBQ类的封装,让查询更加方便,进行JDBC查询时候不用实例化JDBC对象直接DBDAO.XXXX 即可对数据库操作,支持多种查询返回结果集为list方便操作
 *     				     大大简化编写代码时对rs的操作,提高了代码重用率.
 * -----------------------------------------------------------------------------
 *     No.        Date              Revised by           Description
 *     1          Feb 9, 2011            矫健            	 Created
 *****************************************************************************
 */
public class DBDAO
{
	/**
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行的sql语句
	 * @param sqlParams 参数集合
	 * @param flag 该参数有2个值,一个为list,一个为map(默认为map) list代表返回的list中每个子元素都是list,每个子元素都是rs的一条记录.map代表返回的list中每个子元素都是map,每个子元素都是rs的一条记录
	 * @return List 结果集的集合,未查询到结果的时候listsize为0,有实例,不会为null
	 * 方法功能:利用预处理查询当前sql语句,按照flag要求返回结果
	 */
	public static List queryListByPS(String sql,SqlParameter sqlParams,String flag) {
		return queryListByPS(sql,sqlParams,flag,"");
	}
	public static List queryListByPS(String sql,SqlParameter sqlParams,String flag,String talog)
	{
		DBQ db = new DBQ() ;
		List dataList = null ; 
		
		try {
			if(!"".equals(talog)){
				db.setCatalog(talog);
			}
			dataList = db.queryListByPS(db.getPreparedStatement(sql), sqlParams, flag) ;
		}
		catch (SQLException e)
		{
			CommonUtils.printE(e) ;
		}
		finally
		{
			db.close() ;
		}
		
		return dataList ;
	}
	
	/**
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行的sql
	 * @param flag 该参数有2个值,一个为list,一个为map(默认为map) list代表返回的list中每个子元素都是list,每个子元素都是rs的一条记录.map代表返回的list中每个子元素都是map,每个子元素都是rs的一条记录
	 * @return List 结果集的集合,未查询到结果的时候listsize为0,有实例,不会为null
	 * 方法功能:利用statement查询当前sql语句,按照flag要求返回结果
	 */
	public static List queryList(String sql,String flag)
	{
		DBQ db = new DBQ() ;
		
		List dataList = null ; 
		System.out.println("##--"+sql);
		dataList = db.queryList(sql, flag) ;
		
		db.close() ;
		
		return dataList ;
	}
	
	/**
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行的SQL语句
	 * @param sqlParams 参数集合
	 * @return true成功,false失败
	 * 方法功能:利用预处理对象处理SQL语句增,删,改
	 */
	public static boolean executeSQL(String sql,SqlParameter sqlParams)
	{
		boolean flag = false ;
		
		DBQ db = new DBQ() ;
		
		try
		{
			flag = db.executeSQL(db.getPreparedStatement(sql), sqlParams) ;
		}
		catch (SQLException e)
		{
			CommonUtils.printE(e) ;
		}
		finally
		{
			db.close() ;
		}
		
		return flag ;
	}
	/**
	 * @author 韩飞
	 * @time Jan 5, 2012	
	 * @param sqlParams 中为map 键值对  sql键对应要执行的SQL语句 sqlParams键对应参数集合
	 * @return true成功,false失败
	 * 方法功能:利用预处理对象处理SQL语句增,删,改
	 */
	public static boolean executeSQL(List sqlParams) {
		boolean flag = true ;
		
		DBQ db = new DBQ() ;
		try {
			db.setAutoCommit(false);//设置为不自动提交
			if(sqlParams!=null&&!sqlParams.isEmpty()){
				Map<?, ?> map;
				for(int i=0;i<sqlParams.size();i++){
					map = (Map<?, ?>) sqlParams.get(i);
					flag = db.executeSQL(db.getPreparedStatement((String)map.get("sql")),(SqlParameter) map.get("sqlParams")) ;
				}
			}
			db.commit();//提交事务
		} catch (Exception exception) {
			db.rollback();
			flag = false;
		} finally {
			db.close();
		}
		return flag ;
	}
	/**
	 * 
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行的SQL语句
	 * @return true成功,false失败
	 * 方法功能:利用statement执行sql语句
	 */
	public static boolean executeUpdate(String sql)
	{
		boolean flag = true ;
		
		DBQ db = new DBQ() ;
		
		try
		{
			flag = db.executeCreate(sql) ;
		}
		catch (SQLException e)
		{
			CommonUtils.printE(e) ;
		}
		
		db.close() ;
		
		return flag ;
	}
	
	/**
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行的sql语句
	 * @param sqlParams 参数集合
	 * @param flag 返回对象的类型,map还是list
	 * @return Object 按照flag传的参数转型,如果返回值为null代表未查询出结果
	 * 方法功能:根据flag传的参数,返回当前sql语句可以查询的一条数据,map或者list.
	 */
	public static Object queryObjectByPS(String sql,SqlParameter sqlParams,String flag) {
		return queryObjectByPS(sql,sqlParams,flag,"");
	}
	public static Object queryObjectByPS(String sql,SqlParameter sqlParams,String flag,String talog)
	{
		DBQ db = new DBQ() ;
		Object obj = null ;
		
		try
		{
			if(!"".equals(talog)){
				db.setCatalog(talog);
			}
			obj = db.queryObjectByPS(db.getPreparedStatement(sql),sqlParams,flag) ;
		}
		catch (SQLException e)
		{
			CommonUtils.printE(e) ;
		}
		finally
		{
			db.close() ;
		}
		
		return obj ;
	}
	
	/**
	 * @author 矫健
	 * @time Feb 9, 2011	
	 * @param sql 要执行sql
	 * @param flag 返回的是list还是map
	 * @return Object 按照flag传的参数转型,如果返回值为null代表未查询出结果
	 * 方法功能:利用statement查询Object
	 */
	public static Object queryObject(String sql,String flag)
	{
		DBQ db = new DBQ() ;
		
		Object obj = null ;
		
		obj = db.queryObject(sql,flag) ;
		
		db.close() ;
		
		return obj ;
	}
	
	
	//DBDAO演示示例
	public static void main(String[] args)
	{
//		String sql = "" ;
//		List dataList ;
//		List tempList ;
//		Map tempMap ;
		/**
		//1.查询演示返回List list中元素还是list
		//查询USER表所有字段
		sql = "SELECT USERNAME,SEX,ADDR FROM USERTEST" ;
		
		dataList = DBDAO.queryListByPS(sql, null, "list") ;//无参数所以传null
		
		//遍历list,外层list遍历每条数据
		for(int i = 0 ; i < dataList.size() ; i ++)
		{
			tempList = (List)dataList.get(i) ;
			//内部list遍历每个字段
			for(int j = 0 ; j < tempList.size() ; j ++)
			{
				System.out.print(tempList.get(j).toString().concat("    "));
			}
			
			//为每一条数据换行显示
			System.out.println("");
		}
		*/
		
		/**
		//2.查询演示返回List list中元素是map
		sql = "SELECT USERNAME,SEX,ADDR FROM USERTEST" ;
		
		dataList = DBDAO.queryListByPS(sql, null, "map") ;//无参数所以传null
		
		//遍历list,外层list遍历每条数据
		for(int i = 0 ; i < dataList.size() ; i ++)
		{
			tempMap = (Map)dataList.get(i) ;
			
			System.out.print(tempMap.get("USERNAME").toString().concat("    "));
			System.out.print(tempMap.get("SEX").toString().concat("    "));
			System.out.print(tempMap.get("ADDR").toString().concat("    "));
			
			//为每一条数据换行显示
			System.out.println("");
		}
		*/
		
		/**
		//3.有参数据查询演示返回List list中元素还是list
		sql = "SELECT ID,USERNAME,SEX,ADDR FROM USERTEST WHERE SEX=?" ;
		SqlParameter sqlParams = new SqlParameter() ;//SqlParameter对象类似于ArrayList
		sqlParams.add("男") ;//第一个参数的值为男,所以第一个元素为"男"其他元素以此类推
		
		dataList = DBDAO.queryListByPS(sql, sqlParams, "list") ;
		
		for(int i = 0 ; i < dataList.size() ; i ++)
		{
			tempList = (List)dataList.get(i) ;
			//内部list遍历每个字段
			for(int j = 0 ; j < tempList.size() ; j ++)
			{
				System.out.print(tempList.get(j).toString().concat("    "));
			}
			
			//为每一条数据换行显示
			System.out.println("");
		}
		 */
		
		/**
		//4.有参数据查询演示返回List list中元素map
		sql = "SELECT ID,USERNAME,SEX,ADDR FROM USERTEST WHERE SEX='".concat("男").concat("'") ;
		SqlParameter sqlParams = new SqlParameter() ;//SqlParameter对象类似于ArrayList
		sqlParams.add("男") ;//第一个参数的值为男,所以第一个元素为"男"其他元素以此类推
		
		dataList = DBDAO.queryList(sql, "map") ;
		
		for(int i = 0 ; i < dataList.size() ; i ++)
		{
			tempMap = (Map)dataList.get(i) ;
			
			System.out.print(tempMap.get("USERNAME").toString().concat("    "));
			System.out.print(tempMap.get("SEX").toString().concat("    "));
			System.out.print(tempMap.get("ADDR").toString().concat("    "));
			//为每一条数据换行显示
			System.out.println("");
		}
		*/
		
		/**
		
		//5.有参利用查询单一数据,返回map
		sql = "SELECT ID,USERNAME,SEX,ADDR FROM USERTEST WHERE ID=?" ;
		SqlParameter sqlParams = new SqlParameter(1) ;//SqlParameter也可以这样传参数,不定参数,具体参见SqlParameter类与不定参数写法
		
		tempMap = (Map) DBDAO.queryObjectByPS(sql, sqlParams, "map") ;//需要判断是否为空再转型
		
		System.out.println(tempMap.get("ID"));
		System.out.println(tempMap.get("USERNAME"));
		System.out.println(tempMap.get("SEX"));
		System.out.println(tempMap.get("ADDR"));
		 */
		
		/**
		//6.有参利用查询单一数据,返回list
		sql = "SELECT ID,USERNAME,SEX,ADDR FROM USERTEST WHERE ID='1'" ;
		
		tempList = (List) DBDAO.queryObject(sql, "list") ;//需要判断是否为空再转型
		
		for(int i = 0 ; i < tempList.size() ; i ++)
		{
			System.out.print(tempList.get(i).toString().concat("    "));
		}
		 */
	}
}
